package com.bookrecomm.controller;

import com.bookrecomm.service.DataAnalysisService;
import com.bookrecomm.vo.HotKeywordVO;
import com.bookrecomm.vo.MarketTrendVO;
import com.bookrecomm.vo.RatingDistributionVO;
import com.bookrecomm.vo.SalesRankingVO;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据分析控制器
 * 提供图书销量、评分、关键词和市场趋势的数据分析接口
 */
@RestController
@RequestMapping("/analysis")
@RequiredArgsConstructor
public class DataAnalysisController {
    
    private final DataAnalysisService dataAnalysisService;
    
    /**
     * 获取销量排行数据
     * @param categoryId 分类ID，如果为null则查询所有分类
     * @param timeRange 时间范围（day, week, month, year）
     * @param limit 限制返回记录数，默认为10
     * @return 销量排行数据
     */
    @GetMapping("/sales-ranking")
    public ResponseEntity<Map<String, Object>> getSalesRanking(
            @RequestParam(required = false) String categoryId,
            @RequestParam(defaultValue = "month") String timeRange,
            @RequestParam(defaultValue = "10") Integer limit) {
        
        // 处理categoryId，如果是"all"或为null，则传递null给service层表示所有分类
        Long categoryIdLong = null;
        if (categoryId != null && !"all".equalsIgnoreCase(categoryId)) {
            try {
                categoryIdLong = Long.parseLong(categoryId);
            } catch (NumberFormatException e) {
                Map<String, Object> errorResult = new HashMap<>();
                errorResult.put("code", 400);
                errorResult.put("message", "分类ID格式不正确，应为数字或'all'");
                return ResponseEntity.badRequest().body(errorResult);
            }
        }
        
        List<SalesRankingVO> list = dataAnalysisService.getSalesRanking(categoryIdLong, timeRange, limit);
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "获取销量排行数据成功");
        result.put("list", list);
        
        return ResponseEntity.ok(result);
    }
    
    /**
     * 获取评分分布数据
     * @param categoryId 分类ID，如果为null或"all"则查询所有分类
     * @param timeRange 时间范围（day, week, month, year）
     * @return 评分分布数据
     */
    @GetMapping("/rating-distribution")
    public ResponseEntity<Map<String, Object>> getRatingDistribution(
            @RequestParam(required = false) String categoryId,
            @RequestParam(defaultValue = "month") String timeRange) {
        
        // 处理categoryId，如果是"all"或为null，则传递null给service层表示所有分类
        Long categoryIdLong = null;
        if (categoryId != null && !"".equals(categoryId) && !"all".equalsIgnoreCase(categoryId)) {
            try {
                categoryIdLong = Long.parseLong(categoryId);
            } catch (NumberFormatException e) {
                Map<String, Object> errorResult = new HashMap<>();
                errorResult.put("code", 400);
                errorResult.put("message", "分类ID格式不正确，应为数字或'all'");
                return ResponseEntity.badRequest().body(errorResult);
            }
        }
        
        RatingDistributionVO data = dataAnalysisService.getRatingDistribution(categoryIdLong, timeRange);
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "获取评分分布数据成功");
        result.put("data", data.getData());
        
        return ResponseEntity.ok(result);
    }
    
    /**
     * 获取热门关键词
     * @param categoryId 分类ID，如果为null或"all"则查询所有分类
     * @param timeRange 时间范围（day, week, month, year）
     * @param limit 限制返回记录数，默认为20
     * @return 热门关键词列表
     */
    @GetMapping("/hot-keywords")
    public ResponseEntity<Map<String, Object>> getHotKeywords(
            @RequestParam(required = false) String categoryId,
            @RequestParam(defaultValue = "month") String timeRange,
            @RequestParam(defaultValue = "20") Integer limit) {
        
        // 处理categoryId，如果是"all"或为null，则传递null给service层表示所有分类
        Long categoryIdLong = null;
        if (categoryId != null && !"".equals(categoryId) && !"all".equalsIgnoreCase(categoryId)) {
            try {
                categoryIdLong = Long.parseLong(categoryId);
            } catch (NumberFormatException e) {
                Map<String, Object> errorResult = new HashMap<>();
                errorResult.put("code", 400);
                errorResult.put("message", "分类ID格式不正确，应为数字或'all'");
                return ResponseEntity.badRequest().body(errorResult);
            }
        }
        
        List<HotKeywordVO> list = dataAnalysisService.getHotKeywords(categoryIdLong, timeRange, limit);
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "获取热门关键词数据成功");
        result.put("list", list);
        
        return ResponseEntity.ok(result);
    }
    
    /**
     * 获取市场趋势数据
     * @param categoryId 分类ID，如果为null或"all"则查询所有分类
     * @param timeRange 时间范围（day, week, month, year）
     * @return 市场趋势数据
     */
    @GetMapping("/market-trend")
    public ResponseEntity<Map<String, Object>> getMarketTrend(
            @RequestParam(required = false) String categoryId,
            @RequestParam(defaultValue = "month") String timeRange) {
        
        // 处理categoryId，如果是"all"或为null，则传递null给service层表示所有分类
        Long categoryIdLong = null;
        if (categoryId != null && !"".equals(categoryId) && !"all".equalsIgnoreCase(categoryId)) {
            try {
                categoryIdLong = Long.parseLong(categoryId);
            } catch (NumberFormatException e) {
                Map<String, Object> errorResult = new HashMap<>();
                errorResult.put("code", 400);
                errorResult.put("message", "分类ID格式不正确，应为数字或'all'");
                return ResponseEntity.badRequest().body(errorResult);
            }
        }
        
        List<MarketTrendVO> list = dataAnalysisService.getMarketTrend(categoryIdLong, timeRange);
        
        // 将数据转换为前端需要的格式
        Map<String, Object> data = new HashMap<>();
        
        // 提取日期列表
        List<String> dates = list.stream()
                .map(MarketTrendVO::getDate)
                .distinct()
                .collect(java.util.stream.Collectors.toList());
        
        // 提取销量、评分和收藏数据
        List<Integer> sales = list.stream()
                .map(MarketTrendVO::getSales)
                .collect(java.util.stream.Collectors.toList());
        
        // 将BigDecimal类型转换为Double类型，以保持与前端接口的一致性
        List<Double> ratings = list.stream()
                .map(vo -> vo.getRating().doubleValue())
                .collect(java.util.stream.Collectors.toList());
        
        List<Integer> favorites = list.stream()
                .map(MarketTrendVO::getFavorite)
                .collect(java.util.stream.Collectors.toList());
        
        data.put("dates", dates);
        data.put("sales", sales);
        data.put("ratings", ratings);
        data.put("favorites", favorites);
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "获取市场趋势数据成功");
        result.put("data", data);
        
        return ResponseEntity.ok(result);
    }
}
